package com.example.designpatterns.behavioral.chain;

/**
 * 抽象处理者
 * 它定义了处理请求的接口，并持有下一个处理者的引用。
 *
 * @author scott
 */
public abstract class Middleware {

    private Middleware next;

    /**
     * 构建责任链
     */
    public static Middleware link(Middleware first, Middleware... chain) {
        Middleware head = first;
        for (Middleware nextInChain : chain) {
            head.next = nextInChain;
            head = nextInChain;
        }
        return first;
    }

    /**
     * 具体实现则需要实现的接口
     *
     * @param email    邮箱
     * @param password 密码
     * @return 处理结果
     */
    public abstract boolean check(String email, String password);

    /**
     * 检查当前是否是最后一个处理者，如果是则结束处理
     */
    protected boolean checkNext(String email, String password) {
        if (next == null) {
            return true;
        }
        return next.check(email, password);
    }
}
